#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
const int M = 2 * N;
int e[M], ne[M], h[M], idx;
bool flag[N];
int n, root = 1;
int ans = 0x3f3f3f3f;
//  邻接表存图
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

int dfs(int root)
{
    // cout << root <<  ' ';
    flag[root] = true;
    int now = 0;
    int sum = 1;
    for (int i = h[root]; ~i; i = ne[i])
    {
        if (!flag[e[i]])
        {
            int sub_num = dfs(e[i]);
            now = max(sub_num, now);
            sum += sub_num;
        }
    }
    now = max(now, n - sum);
    ans = min(ans, now);
    return sum;
}

// int dfs(int u)
// {
//     flag[u] = true;
//     int sum = 1, ret = 0;
//     for(int i = h[u]; ~i ; i = ne[i])
//     {
//         int pos = e[i];
//         if(!flag[pos])
//         {
//             //st[pos] = true;
//             //得到整棵树的节点数量
//             int s = dfs(pos);
//             //找到所有子树节点的最大值
//             ret = max(ret, s);
//             sum += s;
//         }
//     }
//     ret = max(ret, n - sum);
//     //cout << ret << ":" << sum << endl;
//     ans = min(ans, ret);
//     return sum;
// }

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    memset(h, -1, sizeof h);
    cin >> n;
    for (int i = 0; i < n - 1; ++i)
    {
        int a, b;
        cin >> a >> b;
        add(a, b), add(b, a);
    }

    dfs(root);
    cout << ans << endl;
    return 0;
}